#!/bin/sh

. /etc/settings

BACKRT_CONF_FILE=/etc/$PROFILE/settings.backrt
[ -s $BACKRT_CONF_FILE ] || BACKRT_CONF_FILE=/etc/defaults/settings.backrt

ETH_CONF_FILE=/etc/$PROFILE/settings.eth
[ -s $ETH_CONF_FILE ] || ETH_CONF_FILE=/etc/defaults/settings.eth

MOD_WIFI_RELAY_NAME=wifi_relay
MOD_WIFI_RELAY_DIR=/opt/$MOD_WIFI_RELAY_NAME
MOD_WIFI_RELAY_CONF_FILE=/opt/$MOD_WIFI_RELAY_NAME/etc/settings

ARP_PROXY_PATH=/proc/sys/net/ipv4/conf

WIFI_CONF_FILE=/etc/$PROFILE/settings.wifi_sta
[ -s $WIFI_CONF_FILE ] || WIFI_CONF_FILE=/etc/defaults/settings.wifi_sta

WLAN_STA_IF=wlan1
MOD_WIFI_RELAY_STATUS_FILE=/var/wifi_sta/wifi_relay

[ -f $WIFI_CONF_FILE ] || exit 1
. $WIFI_CONF_FILE

[ -f $ETH_CONF_FILE ] || exit 1
. $ETH_CONF_FILE

[ -f $BACKRT_CONF_FILE ] || exit 1
. $BACKRT_CONF_FILE

[ -f $MOD_WIFI_RELAY_CONF_FILE ] || cp /opt/$MOD_WIFI_RELAY_NAME/etc/defaults $MOD_WIFI_RELAY_CONF_FILE 2>/dev/null
. $MOD_WIFI_RELAY_CONF_FILE

ETH_ARP_PROXY=`cat $ARP_PROXY_PATH/$MOD_WIFI_RELAY_INTERFACE/proxy_arp`
WLAN_ARP_PROXY=`cat $ARP_PROXY_PATH/$WLAN_STA_IF/proxy_arp`

if [ "$MOD_WIFI_RELAY_INTERFACE" = "eth0" ]; then
  TMP_DHCP=$ETH_DHCP_POOL_ENABLED
  TMP_IP=$ETH_IPADDR
elif [ "$MOD_WIFI_RELAY_INTERFACE" = "eth1" ]; then
  TMP_DHCP=$ETH2_DHCP_POOL_ENABLED
  TMP_IP=$ETH2_IPADDR
elif [ "$MOD_WIFI_RELAY_INTERFACE" = "eth2" ]; then
  TMP_DHCP=$ETH3_DHCP_POOL_ENABLED
  TMP_IP=$ETH3_IPADDR
elif [ "$MOD_WIFI_RELAY_INTERFACE" = "br0" ]; then
  TMP_DHCP=$ETH_DHCP_POOL_ENABLED
  TMP_IP=$ETH_IPADDR
fi

case "$1" in
  start)
    WIFI_RESTARTED=0
    if [ "$MOD_WIFI_RELAY_ENABLED" = "1" ]; then
      if [ "$ETH_ARP_PROXY" != "1" ]; then
          echo 1 > $ARP_PROXY_PATH/$MOD_WIFI_RELAY_INTERFACE/proxy_arp
          /etc/init.d/eth restart > /dev/null
          echo "Ethernet is restarted." > $MOD_WIFI_RELAY_STATUS_FILE
      fi
      if [ "$WLAN_ARP_PROXY" != "1" ]; then
        echo 1 > $ARP_PROXY_PATH/$WLAN_STA_IF/proxy_arp
        /etc/init.d/wifi restart > /dev/null
        echo "WiFi STA is restarted." > $MOD_WIFI_RELAY_STATUS_FILE
        WIFI_RESTARTED=1
      fi
    fi
    if [ "$WIFI_RESTARTED" = "0" ]; then
      $0 start_relayd
      RETVAL=$?
    else
       RETVAL=0
    fi
    exit $RETVAL
    ;;
  start_relayd)
    echo -n "Starting module $MOD_WIFI_RELAY_NAME: "
    if [ "$MOD_WIFI_RELAY_ENABLED" != "1" ]; then
      echo "skipped"
      exit 0
    fi
    if [ "$WIFI_STA_ENABLED" = "0" ] || [ "$WIFI_ENABLED" = "0" ] || [ "$WIFI_OPMODE" = "ap" ] || [ "$WLAN_ENABLED" = "0" ]; then
      echo "failed"
      echo "Wifi STA must be configured and enabled"
      exit 1
    fi
    if [ "$BACKRT_WIFI_ENABLED" != "1" ] || [ "$BACKRT_ENABLED" != "1" ]; then
      echo "failed"
      echo "Backup routes switching for WiFi STA must be enabled for correct function"
      exit 1
    fi
    if  [ "$TMP_DHCP" = "1" ]; then
      echo "failed"
      echo "DHCP service must be disabled on $MOD_WIFI_RELAY_INTERFACE "
      exit 1
    elif [ "$TMP_IP" = "" ]; then
      echo "failed"
      echo "IP address must be set on $MOD_WIFI_RELAY_INTERFACE "
      exit 1
    fi
    OPTIONS="-d -B -D"
    if [ "$MOD_WIFI_RELAY_DHCP_PARSING" = "1" ]; then
      OPTIONS="$OPTIONS -P"
    fi
    if [ "$MOD_WIFI_RELAY_SRC_IPADDR_ARP" = "1" ]; then
      SRC_IPADDR_ARP=`ip addr show dev $WLAN_STA_IF | awk '/inet /{print $2}' | awk '{split($0,a,"/"); print a[1]}'`
      OPTIONS="$OPTIONS -s $SRC_IPADDR_ARP"
    fi
    if [ "$MOD_WIFI_RELAY_ACCESS_ENABLED" = "1" ]; then
      OPTIONS="$OPTIONS -L $TMP_IP"
    fi
    $MOD_WIFI_RELAY_DIR/usr/sbin/relayd -I $WLAN_STA_IF -I $MOD_WIFI_RELAY_INTERFACE $OPTIONS 2> $MOD_WIFI_RELAY_STATUS_FILE &
    RETVAL=$?
    if [ $RETVAL = 0 ]; then
      echo "done"
      exit 0
    else
      echo "failed"
      exit 1
    fi
    ;;
  stop)
    $0 stop_relayd
    if [ "$MOD_WIFI_RELAY_ENABLED" = "0" ]; then
      if [ "$ETH_ARP_PROXY" != "0" ]; then
        echo 0 > $ARP_PROXY_PATH/$MOD_WIFI_RELAY_INTERFACE/proxy_arp
        /etc/init.d/eth restart > /dev/null
      fi
      if [ "$WLAN_ARP_PROXY" != "0" ]; then
        echo 0 > $ARP_PROXY_PATH/$WLAN_STA_IF/proxy_arp
        /etc/init.d/wifi restart > /dev/null
      fi
    fi
    exit 0
    ;;
  stop_relayd)
    echo -n "Stopping module $MOD_WIFI_RELAY_NAME: "
    killall relayd 2>/dev/null
    rm -rf $MOD_WIFI_RELAY_STATUS_FILE
    echo "done"
    exit 0
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  status)
    if [ "$WIFI_STA_ENABLED" = "0" ] || [ "$WIFI_ENABLED" = "0" ]; then
      echo "Error             :  WiFi STA is not enabled"
      $0 stop &>/dev/null
    fi
    if [ -n "$WIFI_OPMODE" ] && [ "$WIFI_OPMODE" != "sta" ]; then
      echo "Error             :  Wifi STA mode is not set"
      $0 stop &>/dev/null
    fi
    if [ -n "$WLAN_ENABLED" ] && [ "$WLAN_ENABLED" != "1" ]; then
      echo "Error             :  WLAN is not enabled"
      $0 stop &>/dev/null
    fi
    if [ "$BACKRT_ENABLED" != "1" ]; then
      echo "Error             :  Backup Routes swithing is not enabled"
      $0 stop &>/dev/null
    fi
    if [ "$BACKRT_WIFI_ENABLED" != "1" ]; then
      echo "Error             :  Backup Routes swithing for WiFi STA is not enabled"
      $0 stop &>/dev/null
    fi
    if [ "$TMP_DHCP" = "1" ]; then
      echo "Error             :  DHCP service must to be disabled on $MOD_WIFI_RELAY_INTERFACE"
      $0 stop &>/dev/null
    elif [ "$TMP_IP" = "" ]; then
      echo "Error             :  IP address must be set on $MOD_WIFI_RELAY_INTERFACE"
      $0 stop &>/dev/null
    fi
    echo -n "Relayd            :  "
    killall -0 relayd 2>/dev/null
    RETVAL=$?
    if [ $RETVAL = 0 ]; then echo "running"; else echo "stopped"; fi
    if [ -f $MOD_WIFI_RELAY_STATUS_FILE ]; then
      echo ""
      echo "Relayd status:"
      cat $MOD_WIFI_RELAY_STATUS_FILE
    fi
    exit 0
    ;;
  defaults)
    cp /opt/$MOD_WIFI_RELAY_NAME/etc/defaults $MOD_WIFI_RELAY_CONF_FILE 2>/dev/null
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|status|defaults}"
    exit 1
esac
